package com.moyoutian.leetcode;

import java.util.*;

/**
 * 1705. 吃苹果的最大数目
 * <p>
 * <p>
 * 有一棵特殊的苹果树，一连 n 天，每天都可以长出若干个苹果。在第 i 天，树上会长出 apples[i] 个苹果，这些苹果将会在 days[i] 天后（也就是说，第 i + days[i] 天时）腐烂，变得无法食用。也可能有那么几天，树上不会长出新的苹果，此时用 apples[i] == 0 且 days[i] == 0 表示。
 * <p>
 * 你打算每天 最多 吃一个苹果来保证营养均衡。注意，你可以在这 n 天之后继续吃苹果。
 * <p>
 * 给你两个长度为 n 的整数数组 days 和 apples ，返回你可以吃掉的苹果的最大数目。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：apples = [1,2,3,5,2], days = [3,2,1,4,2]
 * <p>
 * 输出：7
 * <p>
 * 解释：你可以吃掉 7 个苹果：
 * <p>
 * <p>
 * - 第一天，你吃掉第一天长出来的苹果。
 * <p>
 * - 第二天，你吃掉一个第二天长出来的苹果。
 * <p>
 * - 第三天，你吃掉一个第二天长出来的苹果。过了这一天，第三天长出来的苹果就已经腐烂了。
 * <p>
 * - 第四天到第七天，你吃的都是第四天长出来的苹果。
 * <p>
 * <p>
 * 示例 2：
 * <p>
 * <p>
 * 输入：apples = [3,0,0,0,0,2], days = [3,0,0,0,0,2]
 * <p>
 * 输出：5
 * <p>
 * 解释：你可以吃掉 5 个苹果：
 * <p>
 * - 第一天到第三天，你吃的都是第一天长出来的苹果。
 * <p>
 * - 第四天和第五天不吃苹果。
 * <p>
 * - 第六天和第七天，你吃的都是第六天长出来的苹果。
 * <p>
 * <p>
 * 提示：
 * <p>
 * <p>
 * apples.length == n
 * <p>
 * days.length == n
 * <p>
 * 1 <= n <= 2 * 104
 * <p>
 * 0 <= apples[i], days[i] <= 2 * 104
 * <p>
 * 只有在 apples[i] = 0 时，days[i] = 0 才成立
 */
public class Demo1705 {
    public static void main(String[] args) {
//        int[] apples = {1, 2, 3, 5, 2}, days = {3, 2, 1, 4, 2};
        int[] apples = {3, 0, 0, 0, 0, 2}, days = {3, 0, 0, 0, 0, 2};
        System.out.println(eatenApples(apples, days));
    }

    /**
     * @param apples 每天的苹果数量  0<=apples[i]
     * @param days   该天的苹果腐烂的天数 day[i] n=i+day[i]天时腐烂
     * @return 你能能吃到的最大的苹果数量
     */
    public static int eatenApples(int[] apples, int[] days) {
        int count = 0;
        //day , count 过期的那天的苹果数量
        TreeMap<Integer, Integer> treeMap = new TreeMap<>();
        for (int i = 0; i < apples.length; i++) {
            if (apples[i] >= 0) {//当前天产了苹果
                //过期那天的苹果数量
                int tempCount = treeMap.getOrDefault(i + days[i], 0);
                //加上新的苹果数量
                treeMap.put(i + days[i], tempCount + apples[i]);
            }
            if (cons(treeMap, i)) {
                count++;
            }
        }
        int i = apples.length;
        while (cons(treeMap, i++)) {
            count++;
        }
        return count;
    }

    /**
     * @param treeMap 可消费<mDay,count>
     * @param mDay    当前第几天
     * @return 消费成功还是失败
     */
    private static boolean cons(TreeMap<Integer, Integer> treeMap, int mDay) {
        Map.Entry<Integer, Integer> em;
        System.out.println("数量：" + treeMap);
        while ((em = treeMap.firstEntry()) != null) {//消费最早过期天的信息
            if (em.getKey() > mDay) { //如果到了当前天还没过期,第 i+day[i]天已经不能用
                if (em.getValue() >= 1) {//大于1个才能消费
                    treeMap.put(em.getKey(), em.getValue() - 1);
                    System.out.println("消费成功:" + treeMap);
                    //消费成功退出
                    return true;
                } else {
                    treeMap.remove(em.getKey());
                }
            } else {
                treeMap.remove(em.getKey());
            }
        }
        return false;
    }
}
